package controller

import (
	"fmt"
	"github.com/kataras/iris/v12"
	"github.com/spf13/cast"
	"golang.org/x/crypto/bcrypt"
	"wit-admin-go/conf"
	"wit-admin-go/system/app/dto"
	"wit-admin-go/system/app/service"
	witJwt "wit-admin-go/system/jwt"
	"wit-admin-go/system/utils"
	log "wit-admin-go/system/zaplogger"
)

type UserController struct{}

var User = new(UserController)

// GetUserById
//
//	@Tags		user
//	@Summary	通过id获取用户信息
//	@accept		x-www-form-urlencoded
//	@Produce	x-www-form-urlencoded
//	@Param		id	query	string	true	"user id"
//	@Success	200
//	@Router		/user/getUserById [get]
//
// @Security ApiKeyAuth
func (us *UserController) GetUserById(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	user, err := service.UserService.GetUserById(id)
	if err != nil {
		res.Code = iris.StatusInternalServerError
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Data = user
		res.Msg = "请求成功"
	}
	_ = ctx.JSON(res)
}

// GetUserInfo
//
//		@Tags		user
//		@Summary	获取当前用户信息
//	 @Description 获取当前登录的用户信息
//		@accept		x-www-form-urlencoded
//		@Produce	x-www-form-urlencoded
//		@Success	200
//		@Router		/user/getUserInfo [get]
//
// @Security ApiKeyAuth
func (us *UserController) GetUserInfo(ctx iris.Context) {
	res := new(dto.Result)
	id := GetUser(ctx).Id
	fmt.Println(id)
	user, err := service.UserService.GetUserById(id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = "数据没找到"
	} else {
		res.Code = iris.StatusOK
		res.Data = user
		res.Msg = "请求成功"
	}
	_ = ctx.JSON(res)
}

// CreateUser  添加用户
//
//	@Summary		添加用户
//	@Description	添加用户，不给roleId默认是普通角色和对应的接口权限
//	@Tags			user
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			name		query	string	true	"用户名"
//	@Param			userName	query	string	true	"账号"
//	@Param			password	query	string	true	"密码"
//	@Param			roleId		query	string	false	"角色Id"
//	@Param			age			query	int		false	"年龄"
//	@Param			sex			query	bool	false	"性别"
//	@Param			phone		query	string	false	"手机号"
//	@Param			email		query	string	false	"邮箱"
//	@Param			avatar		query	string	false	"头像"
//	@Param			memo		query	string	false	"备注"
//	@Success		200
//	@Router			/user/createUser [post]
func (us *UserController) CreateUser(ctx iris.Context) {
	res := new(dto.Result)
	user := new(dto.User)
	user.Id = utils.GetUid()
	user.CreateId = GetUser(ctx).Id
	err := ctx.ReadForm(user)
	password, _ := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
	user.Password = cast.ToString(password)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	err = service.UserService.PostCreateUser(*user)
	if err != nil {
		res.Code = iris.StatusInternalServerError
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "创建成功"
	}
	_ = ctx.JSON(res)
}

// UpdateUser  修改用户
//
//	@Summary		修改用户
//	@Description	修改用户，传roleId会修改对应的角色和接口权限
//	@Tags			user
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id			query	string	true	"ID"
//	@Param			name		query	string	false	"用户名"
//	@Param			roleId		query	string	false	"角色Id"
//	@Param			age			query	int		false	"年龄"
//	@Param			sex			query	bool	false	"性别"
//	@Param			phone		query	string	false	"手机号"
//	@Param			email		query	string	false	"邮箱"
//	@Param			avatar		query	string	false	"头像"
//	@Param			memo		query	string	false	"备注"
//	@Success		200
//	@Router			/user/updateUser [put]
//
// @Security ApiKeyAuth
func (us *UserController) UpdateUser(ctx iris.Context) {
	res := new(dto.Result)
	user := new(dto.UpdateUser)

	err := ctx.ReadForm(user)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	err = service.UserService.PutUpdateUser(*user)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "修改成功"
	}
	_ = ctx.JSON(res)
}

// UpdateUserPassword  修改用户密码
//
//	@Summary		修改用户密码
//	@Description	修改用户密码
//	@Tags			user
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id				query	string	true	"ID"
//	@Param			password		query	string	true	"新密码"
//	@Param			towPassword		query	string	true	"确认密码"
//	@Success		200
//	@Router			/user/updateUserPassword [put]
//
// @Security ApiKeyAuth
func (us *UserController) UpdateUserPassword(ctx iris.Context) {
	res := new(dto.Result)
	user := new(dto.UpdateUserPassword)
	user.UpdateId = GetUser(ctx).Id
	err := ctx.ReadForm(user)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	if user.Password != user.TowPassword {
		res.Code = iris.StatusBadRequest
		res.Msg = "两次密码不一至！"
		_ = ctx.JSON(res)
		return
	}
	password, _ := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
	user.Password = cast.ToString(password)
	err = service.UserService.PutUpdateUserPassword(*user)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "修改成功"
	}
	_ = ctx.JSON(res)
}

// UpdatePassword  修改密码
//
//	@Summary		修改密码
//	@Description	修改密码
//	@Tags			user
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			password		query	string	true	"原密码"
//	@Param			newPassword		query	string	true	"新密码"
//	@Param			towPassword		query	string	true	"确认密码"
//	@Success		200
//	@Router			/user/updatePassword [put]
//
// @Security ApiKeyAuth
func (us *UserController) UpdatePassword(ctx iris.Context) {
	res := new(dto.Result)
	user := new(dto.UpdatePassword)
	user.UpdateId = GetUser(ctx).Id
	user.Id = GetUser(ctx).Id
	err := ctx.ReadForm(user)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	if user.NewPassword != user.TowPassword {
		res.Code = iris.StatusBadRequest
		res.Msg = "两次密码不一至！"
		_ = ctx.JSON(res)
		return
	}
	err = service.UserService.PutUpdatePassword(*user)
	if err != nil {
		if err.Error() == "原密码错误！" {
			res.Code = iris.StatusBadRequest
		} else {
			res.Code = iris.StatusNotFound
		}
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "修改成功"
	}
	_ = ctx.JSON(res)
}

// GetList 获取所有用户
//
//	@Summary		获取用户信息列表
//	@Description	获取用户信息列表
//	@Tags			user
//	@Param			pageNum			query	int		false	"页码"
//	@Param			pageSize		query	int		false	"每页数"
//	@Param			userName		query	string	false	"用户名"
//	@Param			name			query	string	false	"昵称"
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Success		200
//	@Router			/user/getUserList [get]
//
// @Security ApiKeyAuth
func (us *UserController) GetList(ctx iris.Context) {
	res := new(dto.Result)
	page := new(dto.UserPage)
	if err := ctx.ReadForm(page); err != nil {
		res.Code = iris.StatusBadRequest
		res.Msg = "参数错误"
		_ = ctx.JSON(res)
		return
	}
	user, total := service.UserService.GetUserList(page)
	res.Data = user
	res.Msg = "请求成功"
	res.Code = iris.StatusOK
	// Header返回总条数
	utils.SetTotal(ctx, total)
	_ = ctx.JSON(res)
}

// DeleteUser 删除用户
//
//	@Summary		删除用户
//	@Description	删除用户
//	@Tags			user
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id	query	string	true	"user id"
//	@Success		200
//	@Router			/user/deleteUser [delete]
//
// @Security ApiKeyAuth
func (us *UserController) DeleteUser(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	err := service.UserService.DelUser(id, GetUser(ctx).Id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "删除成功"
	}
	_ = ctx.JSON(res)
}

// RemoveUser 永久删除用户
//
//	@Summary		永久删除用户
//	@Description	永久删除用户
//	@Tags			user
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id	query	string	true	"user id"
//	@Success		200
//	@Router			/user/removeUser [delete]
//
// @Security ApiKeyAuth
func (us *UserController) RemoveUser(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	err := service.UserService.RemoveUser(id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "删除成功"
	}
	_ = ctx.JSON(res)
}

// LogIn
//
//	@Summary		用户登录
//	@Description	用户登录，可通过账号、手机号、邮箱号登录
//	@Tags			user
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			userName	query	string	true	"账号、手机号、邮箱号"
//	@Param			password	query	string	true	"密码"
//	@Success		200
//	@Router			/user/login [post]
func (us *UserController) LogIn(ctx iris.Context) {
	login := new(dto.Login)
	if err := ctx.ReadForm(login); err != nil {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "参数错误"))
		return
	}
	err := service.UserService.LogIn(*login, ctx)
	if err != nil {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "账号或密码输入错误"))
		return
	}
}

// GetUser 获取用户信息
func GetUser(ctx iris.Context) witJwt.PlayLoad {
	token := ctx.GetHeader(conf.CONFIG.WitAdmin.Token)
	if utils.IsEmpty(token) {
		token = ctx.GetHeader("token")
	}
	user, _ := witJwt.ParseToken(token)
	return user
}
